{
 "metadata": {
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%matplotlib inline\n",
      "from os.path import expanduser, join\n",
      "from time import time\n",
      "import numpy as np\n",
      "import matplotlib.pyplot as plt\n",
      "\n",
      "from sklearn.metrics import r2_score\n",
      "\n",
      "from sklearn.externals import joblib\n",
      "from sklearn.ensemble import ExtraTreesRegressor\n",
      "from sklearn.linear_model import LinearRegression\n",
      "\n",
      "from pyrallel.ensemble import EnsembleGrower\n",
      "from pyrallel.ensemble import sub_ensemble"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from IPython.parallel import Client\n",
      "lb_view = Client().load_balanced_view()\n",
      "len(lb_view)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 3,
       "text": [
        "95"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Loading the dataset"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This is a NumPy array version of Fold1 of the [MSLR-WEB10K](http://research.microsoft.com/en-us/projects/mslr/) dataset."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "data = np.load(expanduser('~/data/MSLR-WEB10K/mslr-web10k_fold1.npz'))\n",
      "X_train, y_train, qid_train = data['X_train'], data['y_train'], data['qid_train']\n",
      "X_vali, y_vali, qid_vali = data['X_vali'], data['y_vali'], data['qid_vali']\n",
      "X_test, y_test, qid_test = data['X_test'], data['y_test'], data['qid_test']"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 3.82 s, sys: 960 ms, total: 4.78 s\n",
        "Wall time: 15.4 s\n"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Total size in bytes, total number of search results and number of queries:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "(X_train.nbytes + X_vali.nbytes + X_test.nbytes) / 1e6"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "652.904448"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "len(X_train) + len(X_vali) + len(X_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 7,
       "text": [
        "1200192"
       ]
      }
     ],
     "prompt_number": 7
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "len(np.unique(qid_train)) + len(np.unique(qid_vali)) + len(np.unique(qid_test))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 8,
       "text": [
        "10000"
       ]
      }
     ],
     "prompt_number": 8
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Concatenate the training and validation sets as a big development set."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_dev = np.vstack([X_train, X_vali])\n",
      "y_dev = np.concatenate([y_train, y_vali])\n",
      "qid_dev = np.concatenate([qid_train, qid_vali])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 9
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_dev.shape"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 10,
       "text": [
        "(958671, 136)"
       ]
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_dev.dtype"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 11,
       "text": [
        "dtype('float32')"
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Extract a subset of 500 queries to speed up the learning when prototyping"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def subsample(X, y, qid, size, seed=None):\n",
      "    rng = np.random.RandomState(seed)\n",
      "    unique_qid = np.unique(qid)\n",
      "    qid_mask = rng.permutation(len(unique_qid))[:size]\n",
      "    subset_mask = np.in1d(qid_train, unique_qid[qid_mask])\n",
      "    return X[subset_mask], y[subset_mask], qid[subset_mask]\n",
      "\n",
      "\n",
      "X_train_small, y_train_small, qid_train_small = subsample(\n",
      "    X_train, y_train, qid_train, 500, seed=0)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 12
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_train_small.shape"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 13,
       "text": [
        "(62244, 136)"
       ]
      }
     ],
     "prompt_number": 13
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Sanity check:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "len(np.unique(qid_train_small))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 14,
       "text": [
        "500"
       ]
      }
     ],
     "prompt_number": 14
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_train_medium, y_train_medium, qid_train_medium = subsample(\n",
      "    X_train, y_train, qid_train, 1000, seed=0)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 37
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def balance_irrelevant(X, y, qid, seed=None):\n",
      "    \"\"\"Subsample the zero-scored entries\"\"\"\n",
      "    rng = np.random.RandomState(seed)\n",
      "    unique_qid = np.unique(qid)\n",
      "    final_mask = np.ones(shape=y.shape, dtype=np.bool)\n",
      "    for this_qid in unique_qid:\n",
      "        this_mask = qid == this_qid\n",
      "        this_y = y[this_mask]\n",
      "        relevant = this_y >= 2\n",
      "        ratio = float(np.mean(relevant))\n",
      "        if ratio > 0.5:\n",
      "            # already balanced\n",
      "            continue\n",
      "            \n",
      "        final_mask[this_mask] = np.logical_or(\n",
      "            relevant, np.random.random(len(this_y)) > 0.7) \n",
      "    return X[final_mask], y[final_mask], qid[final_mask]\n",
      "\n",
      "X_balanced_small, y_balanced_small, qid_balanced_small = balance_irrelevant(\n",
      "    X_train_small, y_train_small, qid_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 15
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(len(y_train_small))\n",
      "print(len(y_balanced_small))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "62244\n",
        "25307\n"
       ]
      }
     ],
     "prompt_number": 16
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Quantifying ranking success with NDCG"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def dcg(relevances, rank=10):\n",
      "    \"\"\"Discounted cumulative gain at rank (DCG)\"\"\"\n",
      "    relevances = np.asarray(relevances)[:rank]\n",
      "    n_relevances = len(relevances)\n",
      "    if n_relevances == 0:\n",
      "        return 0.\n",
      "\n",
      "    discounts = np.log2(np.arange(n_relevances) + 2)\n",
      "    return np.sum(relevances / discounts)\n",
      " \n",
      " \n",
      "def ndcg(relevances, rank=10):\n",
      "    \"\"\"Normalized discounted cumulative gain (NDGC)\"\"\"\n",
      "    best_dcg = dcg(sorted(relevances, reverse=True), rank)\n",
      "    if best_dcg == 0:\n",
      "        return 0.\n",
      "\n",
      "    return dcg(relevances, rank) / best_dcg"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 17
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ndcg([2, 4, 0, 1, 1, 0, 0], rank=5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 18,
       "text": [
        "0.86253003992915656"
       ]
      }
     ],
     "prompt_number": 18
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ndcg([0, 0, 0, 1, 1, 2, 4], rank=5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 19,
       "text": [
        "0.13201850690866795"
       ]
      }
     ],
     "prompt_number": 19
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ndcg([0, 0, 0, 1, 1, 2, 4], rank=3)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 20,
       "text": [
        "0.0"
       ]
      }
     ],
     "prompt_number": 20
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ndcg([4, 2, 1, 1, 0, 0, 0], rank=5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 21,
       "text": [
        "1.0"
       ]
      }
     ],
     "prompt_number": 21
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def mean_ndcg(y_true, y_pred, query_ids, rank=10):\n",
      "    y_true = np.asarray(y_true)\n",
      "    y_pred = np.asarray(y_pred)\n",
      "    query_ids = np.asarray(query_ids)\n",
      "    # assume query_ids are sorted\n",
      "    ndcg_scores = []\n",
      "    previous_qid = query_ids[0]\n",
      "    previous_loc = 0\n",
      "    for loc, qid in enumerate(query_ids):\n",
      "        if previous_qid != qid:\n",
      "            chunk = slice(previous_loc, loc)\n",
      "            ranked_relevances = y_true[chunk][np.argsort(y_pred[chunk])[::-1]]\n",
      "            ndcg_scores.append(ndcg(ranked_relevances, rank=rank))\n",
      "            previous_loc = loc\n",
      "        previous_qid = qid\n",
      "\n",
      "    chunk = slice(previous_loc, loc + 1)\n",
      "    ranked_relevances = y_true[chunk][np.argsort(y_pred[chunk])[::-1]]\n",
      "    ndcg_scores.append(ndcg(ranked_relevances, rank=rank))\n",
      "    return np.mean(ndcg_scores)\n",
      "\n",
      "\n",
      "mean_ndcg([4, 3, 1, 4, 3], [4, 0, 1, 4, 2], [0, 0, 0, 2, 2], rank=10)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 22,
       "text": [
        "0.9795191506818377"
       ]
      }
     ],
     "prompt_number": 22
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def print_evaluation(model, X, y, qid):\n",
      "    tic = time()\n",
      "    y_predicted = model.predict(X)\n",
      "    prediction_time = time() - tic\n",
      "    print(\"Prediction time: {:.3f}s\".format(prediction_time))\n",
      "    print(\"NDCG@5 score: {:.3f}\".format(\n",
      "    mean_ndcg(y, y_predicted, qid, rank=5)))\n",
      "    print(\"NDCG@10 score: {:.3f}\".format(\n",
      "    mean_ndcg(y, y_predicted, qid, rank=10)))\n",
      "    print(\"NDCG score: {:.3f}\".format(\n",
      "    mean_ndcg(y, y_predicted, qid, rank=None)))\n",
      "    print(\"R2 score: {:.3f}\".format(r2_score(y, y_predicted)))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 23
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def plot_ndcg_by_trees(model, X, y, qid, rank=10):\n",
      "    max_n_trees = len(model.estimators_)\n",
      "    scores = []\n",
      "    \n",
      "    if hasattr(model, 'staged_predict'):\n",
      "        # stage-wise score computation for boosted ensembles\n",
      "        n_trees = np.arange(max_n_trees) + 1\n",
      "        for y_predicted in model.staged_predict(X):\n",
      "            scores.append(mean_ndcg(y, y_predicted, qid, rank=10))\n",
      "    else:\n",
      "        # assume forest-type of tree ensemble: use a log scale to speedup\n",
      "        # the computation\n",
      "        # XXX: partial predictions could be reused\n",
      "        n_trees = np.logspace(0, np.log10(max_n_trees), 10).astype(int)\n",
      "        for j, n in enumerate(n_trees):\n",
      "            y_predicted = sub_ensemble(model, n).predict(X)\n",
      "            scores.append(mean_ndcg(y, y_predicted, qid, rank=rank))\n",
      "            \n",
      "    plt.plot(n_trees, scores)\n",
      "    plt.xlabel(\"Number of trees\")\n",
      "    plt.ylabel(\"Average NDCG@%d\" % rank)\n",
      "    _ = plt.title(\"Impact of the number of trees\")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 24
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import ExtraTreesRegressor\n",
      "\n",
      "etr = ExtraTreesRegressor(n_estimators=200, min_samples_split=5, random_state=1, n_jobs=-1)\n",
      "etr.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 28min 11s, sys: 1.01 s, total: 28min 12s\n",
        "Wall time: 57 s\n"
       ]
      }
     ],
     "prompt_number": 25
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(etr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 1.117s\n",
        "NDCG@5 score: 0.470"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.478"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.730"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.136\n"
       ]
      }
     ],
     "prompt_number": 26
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(etr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x43567d0>"
       ]
      }
     ],
     "prompt_number": 27
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import RandomForestRegressor\n",
      "\n",
      "rfr = RandomForestRegressor(n_estimators=200, min_samples_split=5, random_state=1, n_jobs=-1)\n",
      "rfr.fit(X_balanced_small, y_balanced_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 8min 24s, sys: 172 ms, total: 8min 25s\n",
        "Wall time: 46.4 s\n"
       ]
      }
     ],
     "prompt_number": 136
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(rfr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 1.555s\n",
        "NDCG@5 score: 0.476"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.486"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.733"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: -0.010\n"
       ]
      }
     ],
     "prompt_number": 137
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(rfr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x4c4a5d0>"
       ]
      }
     ],
     "prompt_number": 138
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import RandomForestRegressor\n",
      "\n",
      "rfr2 = RandomForestRegressor(n_estimators=200, min_samples_split=5, random_state=1, n_jobs=-1)\n",
      "rfr2.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 24min 21s, sys: 512 ms, total: 24min 21s\n",
        "Wall time: 2min 18s\n"
       ]
      }
     ],
     "prompt_number": 139
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#rfr.set_params(n_jobs=-1)\n",
      "print_evaluation(rfr2, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 1.644s\n",
        "NDCG@5 score: 0.484"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.493"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.734"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.142\n"
       ]
      }
     ],
     "prompt_number": 140
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(rfr2, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nGMrAh5cUmgAAAABJRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x6071590>"
       ]
      }
     ],
     "prompt_number": 141
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import GradientBoostingRegressor\n",
      "\n",
      "gbr = GradientBoostingRegressor(n_estimators=200, random_state=1, verbose=1)\n",
      "gbr.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "      Iter       Train Loss   Remaining Time \n",
        "         1           0.6470            5.41m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         2           0.6361            4.32m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         3           0.6264            3.93m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         4           0.6184            3.75m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         5           0.6115            3.64m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         6           0.6055            3.50m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         7           0.5999            3.40m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         8           0.5954            3.32m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         9           0.5910            3.26m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        10           0.5875            3.20m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        20           0.5646            2.91m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        30           0.5528            2.66m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        40           0.5457            2.45m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        50           0.5402            2.27m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        60           0.5354            2.10m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        70           0.5316            1.94m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        80           0.5284            1.78m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        90           0.5244            1.64m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       100           0.5219            1.50m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       200           0.5002            0.00s"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "CPU times: user 2min 57s, sys: 32 ms, total: 2min 57s\n",
        "Wall time: 2min 57s\n"
       ]
      }
     ],
     "prompt_number": 146
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(gbr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 3.031s\n",
        "NDCG@5 score: 0.502"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.510"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.743"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.155\n"
       ]
      }
     ],
     "prompt_number": 147
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(gbr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x4bee890>"
       ]
      }
     ],
     "prompt_number": 148
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import GradientBoostingRegressor\n",
      "\n",
      "gbr2 = GradientBoostingRegressor(n_estimators=300, max_depth=3,\n",
      "                                 learning_rate=0.1, loss='ls',\n",
      "                                 random_state=1, verbose=1)\n",
      "gbr2.fit(X_dev, y_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "      Iter       Train Loss   Remaining Time \n",
        "         1           0.6662          163.32m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         2           0.6556          131.63m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         3           0.6464          121.04m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         4           0.6388          117.25m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         5           0.6322          114.55m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         6           0.6268          112.25m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         7           0.6219          109.67m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         8           0.6174          108.07m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         9           0.6136          106.45m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        10           0.6105          104.90m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        20           0.5904           96.37m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        30           0.5807           92.51m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        40           0.5751           87.38m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        50           0.5712           81.67m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        60           0.5682           76.44m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        70           0.5659           71.63m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        80           0.5641           67.39m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        90           0.5626           63.37m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       100           0.5613          481.66m"
       ]
      }
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(gbr2, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(gbr2, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(gbr2, X_dev, y_dev, qid_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import LambdaMART\n",
      "\n",
      "lmart= LambdaMART(n_estimators=300, max_depth=3,\n",
      "                  learning_rate=0.1, random_state=1, verbose=1)\n",
      "lmart.fit(X_train_small, y_train_small, group=qid_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "      Iter       Train Loss   Remaining Time \n",
        "         1           0.4105            8.01m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         2           0.4427            6.38m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         3           0.4445            5.84m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         4           0.4447            5.40m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         5           0.4441            5.18m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         6           0.4438            4.98m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         7           0.4529            4.84m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         8           0.4550            4.71m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         9           0.4557            4.60m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        10           0.4572            4.51m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        20           0.4659            4.00m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        30           0.4828            3.73m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        40           0.4927            3.53m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        50           0.5017            3.35m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        60           0.5069            3.20m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        70           0.5164            3.05m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        80           0.5205            2.91m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        90           0.5262            2.76m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       100           0.5303            2.63m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       200           0.5645            1.31m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       300           0.5844            0.00s"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "CPU times: user 4min 2s, sys: 349 ms, total: 4min 2s\n",
        "Wall time: 4min 2s\n"
       ]
      }
     ],
     "prompt_number": 32
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lmart, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 2.294s\n",
        "NDCG@5 score: 0.490"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.495"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.737"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: -1.423\n"
       ]
      }
     ],
     "prompt_number": 33
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(lmart, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x11d283290>"
       ]
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lmart, X_train_small, y_train_small, qid_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.844s\n",
        "NDCG@5 score: 0.584"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.563"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.756"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: -1.441\n"
       ]
      }
     ],
     "prompt_number": 35
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "lmart= LambdaMART(n_estimators=300, max_depth=3,\n",
      "                  learning_rate=0.1, random_state=1, verbose=1)\n",
      "lmart.fit(X_dev, y_dev, group=qid_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "      Iter       Train Loss   Remaining Time \n",
        "         1           0.4552          158.83m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         2           0.4555          123.79m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         3           0.4555          111.86m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         4           0.4561          105.25m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         5           0.4582          101.11m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         6           0.4637           98.34m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         7           0.4646           96.19m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         8           0.4651           94.57m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "         9           0.4656           93.31m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        10           0.4666           92.22m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        20           0.4810           85.55m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        30           0.4917           81.51m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        40           0.5044           79.35m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        50           0.5120           76.18m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        60           0.5183           73.14m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        70           0.5231           70.31m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        80           0.5273           67.35m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "        90           0.5301           64.28m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       100           0.5338           61.26m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       200           0.5490           30.89m"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "       300           0.5562            0.00s"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "CPU times: user 1h 29min 50s, sys: 8.55 s, total: 1h 29min 58s\n",
        "Wall time: 2h 29min 34s\n"
       ]
      }
     ],
     "prompt_number": 48
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lmart, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 2.441s\n",
        "NDCG@5 score: 0.522"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.525"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.750"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: -1.176\n"
       ]
      }
     ],
     "prompt_number": 49
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lmart, X_dev, y_dev, qid_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 9.917s\n",
        "NDCG@5 score: 0.541"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.539"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.757"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: -1.149\n"
       ]
      }
     ],
     "prompt_number": 56
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(lmart, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x11d274090>"
       ]
      }
     ],
     "prompt_number": 51
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Growing Randomized Trees to predict relevance scores"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.ensemble import RandomForestRegressor\n",
      "\n",
      "base_estimator = RandomForestRegressor(n_estimators=1, min_samples_split=10)\n",
      "grower = EnsembleGrower(lb_view, base_estimator)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 29
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "grower.launch(X_dev, y_dev, n_estimators=200, folder=\"web10k\",\n",
      "              dump_models=False)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 50,
       "text": [
        "Progress: 00% (000/200), elapsed: 0.413s\n"
       ]
      }
     ],
     "prompt_number": 50
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "grower"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 59,
       "text": [
        "Progress: 100% (200/200), elapsed: 1051.006s\n"
       ]
      }
     ],
     "prompt_number": 59
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#grower.wait()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 57
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "rfr = grower.aggregate_model()\n",
      "print(\"Number of trees: {}\".format(len(rfr.estimators_)))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Number of trees: 200\n",
        "CPU times: user 4 ms, sys: 0 ns, total: 4 ms\n",
        "Wall time: 3.03 ms\n"
       ]
      }
     ],
     "prompt_number": 60
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(rfr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 21.488s\n",
        "NDCG@5 score: 0.528"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.531"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.751"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.190\n"
       ]
      }
     ],
     "prompt_number": 61
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plot_ndcg_by_trees(rfr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x25ae3210>"
       ]
      }
     ],
     "prompt_number": 62
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Evaluation of the overfitting of the ensemble:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(rfr, X_train_medium, y_train_medium, qid_train_medium)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 11.140s\n",
        "NDCG@5 score: 0.949"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.953"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.963"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.806\n"
       ]
      }
     ],
     "prompt_number": 63
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Comparing with a baseline linear regression models (with different optimizers and input scaling)"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%time lr = LinearRegression().fit(X_dev, y_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 25.4 s, sys: 1.47 s, total: 26.9 s\n",
        "Wall time: 19.9 s\n"
       ]
      }
     ],
     "prompt_number": 30
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%time y_test_lr = lr.predict(X_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 136 ms, sys: 96.5 ms, total: 232 ms\n",
        "Wall time: 214 ms\n"
       ]
      }
     ],
     "prompt_number": 33
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.221s\n",
        "NDCG@5 score: 0.433"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.450"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.722"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.127\n"
       ]
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Evaluate overfitting by comparing with training set:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(lr, X_dev, y_dev, qid_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 1.035s\n",
        "NDCG@5 score: 0.432"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.451"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.722"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.131\n"
       ]
      }
     ],
     "prompt_number": 40
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Interestingly enough, a slight overfitting of the training set from a regression standpoint (higher r2 score) does not seem to cause overfitting from a ranking standpoint. This would have to be checked with cross-validation though.\n",
      "\n",
      "Let's evaluate the impact of imput feature normalization:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "nlr = LinearRegression(normalize=True).fit(X_dev, y_dev)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 27.2 s, sys: 2.62 s, total: 29.8 s\n",
        "Wall time: 23.9 s\n"
       ]
      }
     ],
     "prompt_number": 47
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(nlr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.235s\n",
        "NDCG@5 score: 0.434"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.450"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.722"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.127\n"
       ]
      }
     ],
     "prompt_number": 49
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "nlr = LinearRegression(normalize=True).fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 1.59 s, sys: 44.5 ms, total: 1.63 s\n",
        "Wall time: 1.22 s\n"
       ]
      }
     ],
     "prompt_number": 53
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(nlr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.228s\n",
        "NDCG@5 score: 0.431"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.448"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.719"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.098\n"
       ]
      }
     ],
     "prompt_number": 54
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.linear_model import SGDRegressor\n",
      "from sklearn.preprocessing import StandardScaler\n",
      "\n",
      "scaler = StandardScaler()\n",
      "X_train_small_scaled = scaler.fit_transform(X_train_small)\n",
      "X_test_scaled = scaler.transform(X_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 55
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "sgdlr = SGDRegressor(alpha=1e-7, learning_rate='constant', eta0=1e-5, n_iter=50).fit(X_train_small_scaled, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 1.26 s, sys: 15 ms, total: 1.27 s\n",
        "Wall time: 1.27 s\n"
       ]
      }
     ],
     "prompt_number": 96
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(sgdlr, X_test_scaled, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.250s\n",
        "NDCG@5 score: 0.433"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.448"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.720"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.118\n"
       ]
      }
     ],
     "prompt_number": 98
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Comparing with a classification to NDCG ranking reduction models"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.linear_model import LogisticRegression\n",
      "from sklearn.base import RegressorMixin\n",
      "from sklearn.preprocessing import StandardScaler\n",
      "from sklearn.base import clone"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 100
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def proba_to_relevance(probas):\n",
      "    \"\"\"MCRank-like reduction of classification proba to DCG predictions\"\"\"\n",
      "    rel = np.zeros(probas.shape[0], dtype=np.float32)\n",
      "    for i in range(probas.shape[1]):\n",
      "        rel += i * probas[:, i]\n",
      "    return rel\n",
      "        \n",
      "        \n",
      "class ClassificationRanker(RegressorMixin):\n",
      "    \n",
      "    def __init__(self, base_estimator=None):\n",
      "        self.base_estimator = base_estimator\n",
      "        \n",
      "    def fit(self, X, y):\n",
      "        self.estimator_ = clone(self.base_estimator)\n",
      "        self.scaler_ = StandardScaler()\n",
      "        X = self.scaler_.fit_transform(X)\n",
      "        self.estimator_.fit(X, y)\n",
      "        \n",
      "    def predict(self, X):\n",
      "        X_scaled = self.scaler_.transform(X)\n",
      "        probas = self.estimator_.predict_proba(X_scaled)\n",
      "        return proba_to_relevance(probas)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 105
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "logr = ClassificationRanker(LogisticRegression(C=1000))\n",
      "logr.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 20min 29s, sys: 2.97 s, total: 20min 32s\n",
        "Wall time: 8h 30min 23s\n"
       ]
      }
     ],
     "prompt_number": 44
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(logr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 1.326s\n",
        "NDCG@5 score: 0.440"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.456"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.724"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.126\n"
       ]
      }
     ],
     "prompt_number": 45
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.linear_model import SGDClassifier\n",
      "\n",
      "sgdlogr = SGDClassifier(loss='modified_huber', alpha=1e-8, n_iter=200, learning_rate='constant', eta0=1e-6, n_jobs=-1)\n",
      "sgdlogrr = ClassificationRanker(sgdlogr)\n",
      "sgdlogrr.fit(X_train_small_scaled, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 860 ms, sys: 993 ms, total: 1.85 s\n",
        "Wall time: 13.9 s\n"
       ]
      }
     ],
     "prompt_number": 146
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(sgdlogrr, X_test_scaled, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 0.564s\n",
        "NDCG@5 score: 0.440"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.454"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.723"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.127\n"
       ]
      }
     ],
     "prompt_number": 147
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import RandomForestClassifier\n",
      "\n",
      "rfc = RandomForestClassifier(n_estimators=200, max_features=20, min_samples_split=5,\n",
      "                            random_state=1, n_jobs=-1)\n",
      "rfr = ClassificationRanker(rfc)\n",
      "rfr.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 3min 34s, sys: 1.3 s, total: 3min 36s\n",
        "Wall time: 1min\n"
       ]
      }
     ],
     "prompt_number": 122
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(rfr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 5.751s\n",
        "NDCG@5 score: 0.468"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.477"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.730"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.138\n"
       ]
      }
     ],
     "prompt_number": 123
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import GradientBoostingClassifier\n",
      "\n",
      "gbc = GradientBoostingClassifier(n_estimators=100, random_state=1)\n",
      "gbr = ClassificationRanker(gbc)\n",
      "gbr.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 5min 52s, sys: 1.45 s, total: 5min 54s\n",
        "Wall time: 5min 54s\n"
       ]
      }
     ],
     "prompt_number": 124
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(gbr, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 5.175s\n",
        "NDCG@5 score: 0.500"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.506"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.743"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.149\n"
       ]
      }
     ],
     "prompt_number": 125
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "\n",
      "from sklearn.ensemble import ExtraTreesClassifier\n",
      "\n",
      "etc = ClassificationRanker(ExtraTreesClassifier(n_estimators=200, random_state=1, n_jobs=-1))\n",
      "etc.fit(X_train_small, y_train_small)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "CPU times: user 2min 5s, sys: 1.8 s, total: 2min 7s\n",
        "Wall time: 36.4 s\n"
       ]
      }
     ],
     "prompt_number": 111
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print_evaluation(etc, X_test, y_test, qid_test)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Prediction time: 7.620s\n",
        "NDCG@5 score: 0.433"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG@10 score: 0.447"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "NDCG score: 0.719"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "R2 score: 0.124\n"
       ]
      }
     ],
     "prompt_number": 112
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Introspecting the distribution of relevance scores predictions"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "subset = np.random.permutation(y_test.shape[0])[:10000]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 66
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.title('Extra Trees predictions')\n",
      "plt.scatter(y_test[subset], y_test_etr[subset], alpha=0.1, s=100)\n",
      "plt.xlabel('True relevance')\n",
      "plt.ylabel('Predicted relevance')\n",
      "plt.ylim(-2, 5)\n",
      "plt.xlim(-2, 5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 67,
       "text": [
        "(-2, 5)"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x98b655d0>"
       ]
      }
     ],
     "prompt_number": 67
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.title('Linear Regression predictions')\n",
      "plt.scatter(y_test[subset], y_test_lr[subset], alpha=0.1, s=100)\n",
      "plt.xlabel('True relevance')\n",
      "plt.ylabel('Predicted relevance')\n",
      "plt.ylim(-2, 5)\n",
      "plt.xlim(-2, 5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 68,
       "text": [
        "(-2, 5)"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nfiGEEMuXLxfXXXedGBwcnHTbiv2DCu9UME1NTcX/A4EAyWQSgM2bN/Od73yHWCxWfGzdupXe3l4A\n7rrrLpYuXVpc9sorrzA8PFxc1/ZhpF3xr//6r4yOjtLf38/ixYv53ve+V9y2YRg0NzcX13/llVcy\nODgIQG9v7w7rb2tr22nd2y/fvHkzzz777A77cu+999Lf3w/AL37xCx555BE6Ojro7OzkmWeeAeAL\nX/gC8+bN48wzz+SQQw7hhhtumHQ/enp6mD17dvF5e3s7PT09xee1tbXoeulnFgwGi8d5Mra3vb29\nHcMwimGvyfbtM5/5THG/amtrAdi2bRu9vb07HZtdfS9btmxh7ty5u7Rpd/T29u60/4VCoXh8Ycfz\nbPv9v+OOO3j99ddZsGABxx57LL/97W/3ygbF28NdbgMUzsEeAG5vb+c//uM/+MpXvrLTezZv3swV\nV1zBk08+yQknnICmaSxdunSHePFUA8maphXfX1tby2233caRRx7J5z73OWbNmoXP52N4eHgHsbRp\nbm5my5Ytxefb/z/Z9tvb2zn11FP5/e9/P6kty5Yt45e//CWmafK9732PD3zgA3R3dxMOh7nxxhu5\n8cYbefXVV3nnO9/Jsccey2mnnbbD51taWujq6mLBggUAdHd309LSstv93x3bx+S7u7vxeDzU1dWR\nSqUm3bevfe1rXHzxxTut54033tjh2AghJj1W9nruv//+SZdN9h1sj73/29vsdrtpbGzcYV8mY968\nedx7772AvPi+//3vZ2RkhEAgsNvPKfYN5ekfhOTzebLZbPExWQbNZNhC/LGPfYxbb72V5557DiEE\nqVSK3/72tySTSVKpFJqmUVdXh2VZ/PSnP+WVV155W/aJt2TUHHbYYbznPe/hP//zP2lububMM8/k\n85//PIlEAsuy2LhxYzEv/gMf+AA333wzPT09jI2NccMNN+x0kdl+/eeeey6vv/46d999N4ZhYBgG\nf//731m/fj2GYXDPPfcwPj6Oy+UiEongcrkAOZC9YcMGhBBUVVXhcrkmFcCLL76YVatWMTQ0xNDQ\nEF//+tf3Op1RCMHdd9/NunXrSKfTXHvttVx44YW7vIheeeWVfPOb32Tt2rWAHAC3B6nPOeccXn31\nVR566CEKhQK33HILfX19k67n3e9+N729vdx8883kcjkSiQTPPfccAI2NjXR1de0yC+riiy/mu9/9\n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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x98b7b4d0>"
       ]
      }
     ],
     "prompt_number": 68
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.hist(y_test, bins=5, alpha=.3, color='b', label='True relevance')\n",
      "plt.hist(y_test_etr, bins=5, alpha=.3, color='g', label='ET predicted relevance')\n",
      "plt.legend(loc='best')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 69,
       "text": [
        "<matplotlib.legend.Legend at 0x98b5c950>"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x98b42410>"
       ]
      }
     ],
     "prompt_number": 69
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "For each query, count the number of results with rank 0, 1, 2, 3 or 4."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "unique_qids_test = np.unique(qid_test)\n",
      "for qid in unique_qids_test[:5]:\n",
      "    qids = y_test[qid_test == qid].astype(np.int)\n",
      "    print(np.bincount(qids, minlength=5))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "[45 54 31  8  0]\n",
        "[59 25  8  2  0]\n",
        "[52 20  9  2  3]\n",
        "[97 45  2  2  2]\n",
        "[32 56 24  7  4]\n"
       ]
      }
     ],
     "prompt_number": 70
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 44
    }
   ],
   "metadata": {}
  }
 ]
}